<?php

namespace util;

/**
 * 示例：
 * <?php
 * require_once("pager.class.php");
 * $subPages=new pager($totalPage,$currentPage);
 * echo $subPages->showpager();
 * ?>
 * */
class Pager
{
    var $each_disNums;          // 每页显示的条目数
    var $nums;                  // 总条目数
    var $current_page;          // 当前被选中的页
    var $sub_pages;             // 每次显示的页数
    var $pageNums;              // 总页数
    var $page_array = array();  // 用来构造分页的数组
    var $subPage_link;          // 每个分页的链接
    var $subPage_type;          // 显示分页的类型
    var $_lang = array(
        'index_page'   => '首页',
        'pre_page'     => '上一页',
        'next_page'    => '下一页',
        'last_page'    => '尾页',
        'current_page' => '当前页：',
        'total_page'   => '总页数：',
        'current_show' => '当前显示：',
        'total_record' => '总记录数：'
    );

    /**
     * __construct是SubPages的构造函数，用来在创建类的时候自动运行.
     * @total_page 总页数
     * @current_num 当前被选中的页
     * @sub_pages 每次显示的页数
     * @subPage_link 每个分页的链接
     * @subPage_type 显示分页的类型
     *
     * 当@subPage_type=1的时候 www.phpfensi.com 为普通分页模式
     * example： 共4523条记录,每页显示10条,当前第1/453页 [首页] [上页] [下页] [尾页]
     * 当@subPage_type=2的时候为经典分页样式
     * example： 当前第1/453页 [首页] [上页] 1 2 3 4 5 6 7 8 9 10 [下页] [尾页]
     */
    public function __construct($total_page, $current_page, $sub_pages = 10, $subPage_link = '', $subPage_type = 2)
    {
        $this->pager($total_page, $current_page, $sub_pages, $subPage_link, $subPage_type);
    }

    public function pager($total_page, $current_page, $sub_pages = 10, $subPage_link = '', $subPage_type = 2)
    {
        if (!$current_page) {
            $this->current_page = 1;
        } else {
            $this->current_page = intval($current_page);
        }
        $this->sub_pages = intval($sub_pages);
        $this->pageNums  = ceil($total_page);
        if ($subPage_link) {
            if (strpos($subPage_link, '?page=') === false AND strpos($subPage_link, '&page=') === false) {
                $subPage_link .= (strpos($subPage_link, '?') === false ? '?' : '&') . 'page=';
            }
        }
        $this->subPage_link = $subPage_link ? $subPage_link : $_SERVER['PHP_SELF'] . '?page=';
        $this->subPage_type = $subPage_type;
    }

    /**
     * show_SubPages函数用在构造函数里面。而且用来判断显示什么样子的分页
     */
    public function showpager()
    {
        if ($this->subPage_type == 1) {
            return $this->pagelist1();
        } elseif ($this->subPage_type == 2) {
            return $this->pagelist2();
        }
    }

    /**
     * 用来给建立分页的数组初始化的函数。
     */
    public function initArray()
    {
        for ($i = 0; $i < $this->sub_pages; $i++) {
            $this->page_array[$i] = $i;
        }
        return $this->page_array;
    }

    /**
     * construct_num_Page该函数使用来构造显示的条目
     * 即使：[1][2][3][4][5][6][7][8][9][10]
     */
    public function construct_num_Page()
    {
        if ($this->pageNums < $this->sub_pages) {
            $current_array = array();
            for ($i=0; $i<$this->pageNums; $i++) {
                $current_array[$i]=$i+1;
            }
        } else {
            $current_array = $this->initArray();
            if ($this->current_page <= 3) {
                for ($i=0; $i<count($current_array); $i++) {
                    $current_array[$i] = $i+1;
                }
            } elseif ($this->current_page <= $this->pageNums && $this->current_page > $this->pageNums-$this->sub_pages+1) {
                for ($i=0; $i<count($current_array); $i++) {
                    $current_array[$i] = ($this->pageNums)-($this->sub_pages)+1+$i;
                }
            } else {
                for ($i=0; $i<count($current_array); $i++) {
                    $current_array[$i] = $this->current_page-2+$i;
                }
            }
        }

        return $current_array;
    }

    /**
     * 构造普通模式的分页
     * 共4523条记录,每页显示10条,当前第1/453页 [首页] [上页] [下页] [尾页]
     */
    public function pagelist1()
    {
        $subPageCss1Str  = "";
        $subPageCss1Str .= $this->_lang['current_page'] . $this->current_page." / " .$this->pageNums."   ";
        if ($this->current_page > 1) {
            $firstPageUrl    = $this->subPage_link."1";
            $prewPageUrl     = $this->subPage_link.($this->current_page-1);
            $subPageCss1Str .= "<a href='$firstPageUrl'>{$this->_lang['index_page']}</a> ";
            $subPageCss1Str .= "<a href='$prewPageUrl'>{$this->_lang['pre_page']}</a> ";
        } else {
            $subPageCss1Str .= "{$this->_lang['index_page']} ";
            $subPageCss1Str .= "{$this->_lang['pre_page']} ";
        }

        if ($this->current_page < $this->pageNums) {
            $lastPageUrl     = $this->subPage_link.$this->pageNums;
            $nextPageUrl     = $this->subPage_link.($this->current_page+1);
            $subPageCss1Str .= " <a href='$nextPageUrl'>{$this->_lang['next_page']}</a> ";
            $subPageCss1Str .= "<a href='$lastPageUrl'>{$this->_lang['last_page']}</a> ";
        } else {
            $subPageCss1Str .= "{$this->_lang['next_page']} ";
            $subPageCss1Str .= "{$this->_lang['last_page']} ";
        }

        return $subPageCss1Str;
    }

    /**
     * 获取分页的HTML内容
     * @param $page     [当前页]
     * @param $pages    [总页数]
     * @param $url      [跳转url地址 最后的页数以 '&page=x' 追加在url后面]
     * @return string   [返回html]
     */
    public function bootstrap_page($page, $pages, $url, $fenge = '&')
    {
        //最多显示多少个页码
        $_pageNum = 10;
        //当前页面小于1 则为1
        $page = $page < 1 ? 1 : $page;
        //当前页大于总页数 则为总页数
        $page = $page > $pages ? $pages : $page;
        //页数小当前页 则为当前页
        $pages = $pages < $page ? $page : $pages;

        //计算开始页
        $_start = $page - floor($_pageNum/2);
        $_start = $_start < 1 ? 1 : $_start;
        //计算结束页
        $_end = $page + floor($_pageNum/2);
        $_end = $_end > $pages? $pages : $_end;

        //当前显示的页码个数不够最大页码数，在进行左右调整
        $_curPageNum = $_end-$_start+1;
        //左调整
        if($_curPageNum<$_pageNum && $_start>1){
            $_start = $_start - ($_pageNum-$_curPageNum);
            $_start = $_start < 1 ? 1 : $_start;
            $_curPageNum = $_end-$_start+1;
        }
        //右边调整
        if($_curPageNum<$_pageNum && $_end<$pages){
            $_end = $_end + ($_pageNum-$_curPageNum);
            $_end = $_end > $pages ? $pages : $_end;
        }

        if ($pages <= 11) {
            $_end = $pages;
        }

        $_pageHtml = '<ul class="pagination">';
        if ($_start == 1) {
            $_pageHtml .= '<li><span>首页</span></li>';
        } else {
            $_pageHtml .= '<li><a title="首页" href="'.$url.$fenge.'page=1">首页</a></li>';
        }
        if ($page > 1) {
            $_pageHtml .= '<li><a title="上一页" href="'.$url.$fenge.'page='.($page-1).'">«</a></li>';
        }
        for ($i = $_start; $i <= $_end; $i++) {
            if ($i == $page) {
                $_pageHtml .= '<li class="active"><span>'.$i.'</span></li>';
            } else {
                $_pageHtml .= '<li><a href="'.$url.$fenge.'page='.$i.'">'.$i.'</a></li>';
            }
        }
        if ($page < $_end) {
            $_pageHtml .= '<li><a title="下一页" href="'.$url.'&page='.($page+1).'">»</a></li>';
        }
        if ($_end == $pages) {
            $_pageHtml .= '<li><span>尾页</span></li>';
        } else {
            $_pageHtml .= '<li><a  title="尾页" href="'.$url.$fenge.'page='.$pages.'">尾页</a></li>';
        }
        $_pageHtml .= '</ul>';

        return $_pageHtml;
    }

    /**
     * 构造经典模式分页
     * 当前第1/453页 [首页] [上页] 1 2 3 4 5 6 7 8 9 10 [下页] [尾页]
     */
    public function pagelist2()
    {
        $subPageCss2Str  = "";
        $subPageCss2Str .= $this->_lang['current_page'] . $this->current_page."/" . $this->pageNums." ";

        if ($this->current_page > 1) {
            $firstPageUrl    = $this->subPage_link."1";
            $prewPageUrl     = $this->subPage_link.($this->current_page-1);
            $subPageCss2Str .= "<a href='$firstPageUrl'>{$this->_lang['index_page']}</a> ";
            $subPageCss2Str .= "<a href='$prewPageUrl'>{$this->_lang['pre_page']}</a> ";
        } else {
            $subPageCss2Str .= "{$this->_lang['index_page']} ";
            $subPageCss2Str .= "{$this->_lang['pre_page']} ";
        }

        $a = $this->construct_num_Page();
        for ($i=0; $i<count($a); $i++) {
            $s=$a[$i];
            if ($s == $this->current_page) {
                $subPageCss2Str .= "[<span style='color:red;font-weight:bold;'>".$s."</span>]";
            } else {
                $url = $this->subPage_link.$s;
                $subPageCss2Str .= "[<a href='$url'>".$s."</a>]";
            }
        }

        if ($this->current_page < $this->pageNums) {
            $lastPageUrl     = $this->subPage_link.$this->pageNums;
            $nextPageUrl     = $this->subPage_link.($this->current_page+1);
            $subPageCss2Str .= "<a href='$nextPageUrl'>{$this->_lang['next_page']}</a>";
            $subPageCss2Str .= "<a href='$lastPageUrl'>{$this->_lang['last_page']}</a>";
        } else {
            $subPageCss2Str .= "{$this->_lang['next_page']}";
            $subPageCss2Str .= "{$this->_lang['last_page']}";
        }
        return $subPageCss2Str;
    }


    /**
     * __destruct析构函数，当类不在使用的时候调用，该函数用来释放资源。
     */
    public function __destruct()
    {
        unset($each_disNums);
        unset($nums);
        unset($current_page);
        unset($sub_pages);
        unset($pageNums);
        unset($page_array);
        unset($subPage_link);
        unset($subPage_type);
    }
}
